#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
天翼云盘路径解析器
提供路径到文件ID/文件夹ID的转换功能
"""

import os
from typing import Optional, Dict, Any, List
from src.common.unified_logging import get_logger

class PathResolver:
    """路径解析器 - 负责将文件路径转换为文件ID或文件夹ID"""
    
    def __init__(self, client):
        """
        初始化路径解析器
        
        Args:
            client: TianyiPCClient实例
        """
        self.client = client
        self.logger = get_logger(f"PathResolver_{client.username}")
    
    def get_file_id_by_path(self, path: str) -> Optional[str]:
        """
        根据路径获取文件ID - 正确的目录结构查找
        
        Args:
            path: 文件路径，如 /folder1/folder2/file.txt
            
        Returns:
            Optional[str]: 文件ID，如果文件不存在则返回None
        """
        try:
            # 标准化路径
            path = path.strip()
            if not path or path == '/':
                return None
            
            # 确保路径以/开头
            if not path.startswith('/'):
                path = '/' + path
            
            # 分离目录和文件名
            dir_path = os.path.dirname(path)
            file_name = os.path.basename(path)
            
            self.logger.debug(f"解析路径: {path} -> 目录: {dir_path}, 文件名: {file_name}")
            
            # 获取父目录ID
            if dir_path == '' or dir_path == '/':
                parent_folder_id = '-11'  # 根目录
            else:
                parent_folder_id = self.get_folder_id_by_path(dir_path)
                if not parent_folder_id:
                    self.logger.debug(f"父目录不存在: {dir_path}")
                    return None
            
            self.logger.debug(f"父目录ID: {parent_folder_id}")
            
            # 在父目录中查找文件
            files = self.client.get_files(parent_folder_id)
            if not files:
                self.logger.debug(f"父目录为空: {dir_path}")
                return None
            
            # 查找匹配的文件
            for file in files:
                if file.get('name') == file_name and not file.get('isFolder', False):
                    file_id = file.get('id')
                    self.logger.debug(f"找到文件: {path} -> ID: {file_id}")
                    return file_id
            
            self.logger.debug(f"文件不存在: {path}")
            return None
            
        except Exception as e:
            self.logger.error(f"获取文件ID失败: {path}, 错误: {e}")
            return None
    
    def get_folder_id_by_path(self, path: str) -> Optional[str]:
        """
        根据路径获取文件夹ID
        
        Args:
            path: 文件夹路径，如 /folder1/folder2
            
        Returns:
            Optional[str]: 文件夹ID，如果文件夹不存在则返回None
        """
        try:
            # 标准化路径
            path = path.strip()
            if not path or path == '/':
                return '-11'  # 根目录
            
            # 移除开头的斜杠
            path = path.lstrip('/')
            
            # 分割路径
            parts = path.split('/')
            current_folder_id = '-11'  # 从根目录开始
            
            # 逐层查找
            for part in parts:
                if not part:
                    continue
                
                # 在当前文件夹中查找下一级文件夹
                files = self.client.get_files(current_folder_id)
                if not files:
                    self.logger.debug(f"当前文件夹为空，路径: /{'/'.join(parts[:parts.index(part)])}")
                    return None
                
                # 查找匹配的文件夹
                found = False
                for file in files:
                    if file.get('name') == part and file.get('isFolder', False):
                        current_folder_id = file.get('id')
                        found = True
                        self.logger.debug(f"找到文件夹: {part} -> ID: {current_folder_id}")
                        break
                
                if not found:
                    self.logger.debug(f"文件夹不存在: {part}")
                    return None
            
            self.logger.debug(f"找到文件夹路径: {path} -> ID: {current_folder_id}")
            return current_folder_id
            
        except Exception as e:
            self.logger.error(f"获取文件夹ID失败: {path}, 错误: {e}")
            return None
    
    def get_file_info_by_path(self, path: str) -> Optional[Dict[str, Any]]:
        """
        根据路径获取文件完整信息 - 正确的目录结构查找
        
        Args:
            path: 文件路径
            
        Returns:
            Optional[Dict[str, Any]]: 文件信息字典，包含id, name, size, isFolder等字段
        """
        try:
            # 标准化路径
            path = path.strip()
            if not path or path == '/':
                return None
            
            # 确保路径以/开头
            if not path.startswith('/'):
                path = '/' + path
            
            # 分离目录和文件名
            dir_path = os.path.dirname(path)
            file_name = os.path.basename(path)
            
            self.logger.debug(f"解析路径: {path} -> 目录: {dir_path}, 文件名: {file_name}")
            
            # 获取父目录ID
            if dir_path == '' or dir_path == '/':
                parent_folder_id = '-11'  # 根目录
            else:
                parent_folder_id = self.get_folder_id_by_path(dir_path)
                if not parent_folder_id:
                    self.logger.debug(f"父目录不存在: {dir_path}")
                    return None
            
            self.logger.debug(f"父目录ID: {parent_folder_id}")
            
            # 在父目录中查找文件
            files = self.client.get_files(parent_folder_id)
            if not files:
                self.logger.debug(f"父目录为空: {dir_path}")
                return None
            
            # 查找匹配的文件
            for file in files:
                if file.get('name') == file_name:
                    self.logger.debug(f"找到文件信息: {path} -> {file}")
                    return file
            
            self.logger.debug(f"文件不存在: {path}")
            return None
            
        except Exception as e:
            self.logger.error(f"获取文件信息失败: {path}, 错误: {e}")
            return None
    
    def resolve_path(self, path: str) -> Optional[Dict[str, Any]]:
        """
        解析路径，返回路径对应的文件或文件夹信息
        
        Args:
            path: 文件或文件夹路径
            
        Returns:
            Optional[Dict[str, Any]]: 包含id, name, isFolder, parentId等信息的字典
        """
        try:
            # 标准化路径
            path = path.strip()
            if not path:
                return None
            
            if path == '/':
                return {
                    'id': '-11',
                    'name': '',
                    'isFolder': True,
                    'parentId': None,
                    'path': '/'
                }
            
            # 尝试作为文件夹解析
            folder_id = self.get_folder_id_by_path(path)
            if folder_id:
                return {
                    'id': folder_id,
                    'name': os.path.basename(path),
                    'isFolder': True,
                    'path': path
                }
            
            # 尝试作为文件解析
            file_info = self.get_file_info_by_path(path)
            if file_info:
                file_info['path'] = path
                return file_info
            
            return None
            
        except Exception as e:
            self.logger.error(f"解析路径失败: {path}, 错误: {e}")
            return None

